package com.xh.hongaicodegenerator.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.xh.hongaicodegenerator.exception.BusinessException;
import com.xh.hongaicodegenerator.exception.ErrorCode;
import com.xh.hongaicodegenerator.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;


/**
 * 代码文件保存模板类
 * 模板类设计模式: 规定模板方法（进行代码解析的步骤），子类根据自身需要修改步骤执行细节
 * @param <T>
 */
public abstract class CodeFileSaverTemplate<T> {
    // 文件保存根目录
    private static final String FILE_SAVE_ROOT_DIR = System.getProperty("user.dir") + "/tmp/code_output";

    /**
     * 保存代码的模板方法
     * @param result
     * @return
     */
    public final File saveCode(T result, Long appID){

        validateInput(result);

        String baseDir = buildUniqueDir(appID);

        saveFiles(result,baseDir);

        return new File(baseDir);
    }

    /**
     * 保存文件 交由子类实现
     * @param result
     * @param baseDirPath
     */
    protected abstract void saveFiles(T result, String baseDirPath);

    /**
     * 构建唯一目录路径：tmp/code_output/codeType_雪花ID
     * @return 唯一目录路径
     */
    private String buildUniqueDir(Long appID) {
        if (appID == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"appID不能为空");
        }
        String codeType = getCodeType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", codeType, appID);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 验证输入
     * @param result
     */
    protected void validateInput(T result){
        if (result == null) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"生成代码结果不能为空");
        }
    };


    /**
     * 获取生成代码的类型
     * @return
     */
    protected abstract CodeGenTypeEnum getCodeType();

    /**
     * 写入单个文件
     */
    protected static void writeToFile(String dirPath, String filename, String content) {
        String filePath = dirPath + File.separator + filename;
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }
}
